// 负责 统一封装 axios
import axios from 'axios'
// axios({})
// 导入 vuex 仓库
import store from '@/store'

// 导入更新token方法
import { getNewToken } from '@/api/user'

// 1.设置 及地址（简化和复用及地址）
const axios1 = axios.create({
  // 设置当前axios对象的及地址
  baseURL: 'http://toutiao.itheima.net/'
})

// const axios2 = axios.create({
//     // 设置当前axios对象的及地址
//     baseURL: 'http://toutiao1.itheima.net/'
// })

// 2.设置 拦截器 (请求拦截器 和 响应拦截器)
// 每当 axios 发送请求之前会先执行一次，然后再生成请求报文 发给服务器
// conf:是本次 axios请求的配置信息对象，包含程序员传入的信息
axios1.interceptors.request.use(function (conf) {
  // 如果本次请求是去请求新的token,那么此时headers中已经有了refresh_token
  // 所以 只有headers中不包含token，且仓库中有token时，才向headers中添加token
  if (!conf.headers.Authorization && store.state.user && store.state.user.token) {
    // 在发送请求之前，为请求报文头追加token
    conf.headers.Authorization = `Bearer ${store.state.user.token}`
  }
  return conf
})

// 3.通过响应拦截器处理401错误
axios1.interceptors.response.use(function (res) {
  console.log('响应拦截器 成功->', res)
  return res
}, async function (err) {
  // 如果响应状态码为401，则：
  // 处理方式2：重新获取token，并重新执行新的token
  if (err.response.status === 401) {
    try {
      // 使用 refresh_token 去服务器重新请求token
      const res = await getNewToken(store.state.user.refresh_token)
      const newTokens = { token: res.data.data.token, refresh_token: store.state.user.refresh_token }
      // 更新vuex中的token，更新localStroage中的token
      store.commit('setUserToken', newTokens)
      // 修改上一次请求的token
      err.config.headers.Authorization = 'Bearer ' + newTokens.token
      // 重新发送请求
      return axios(err.config)
    } catch (error) {
      // 处理方式1：跳转到登录页面，提醒用户登录
      window.location.hash = '#/login'
    }
  }
  return Promise.reject(err)
})

export default axios1
